package com.afdor.rws.core.extension;

import com.afdor.rws.annotation.extension.SPI;

import java.util.Collection;

/**
 * 扩展点加载工厂类
 *
 * @author 悭梵
 * @date Created in 2018-08-03 20:50
 */
@SPI("default")
public interface ExtensionFactory {

    /**
     * 是否存在指定名称的扩展点
     *
     * @param name
     * @return
     */
    <T> boolean hasExtension(Class<T> interfaceClass, String name);

    /**
     * 每次都创建一个新的扩展点实例
     *
     * @param interfaceClass 扩展点接口类
     * @param name
     * @param args
     * @param <T>
     * @return
     */
    <T> T newExtension(Class<T> interfaceClass, String name, Object... args);

    /**
     * 得到扩展点， 这里会根据@Extension.Scope决定扩展点的作用域
     *
     * @param interfaceClass 扩展点接口类
     * @param name           对象名称
     * @return 返回对象实例
     */
    <T> T getExtension(Class<T> interfaceClass, String name);


    /**
     * 加载扩展点实现类，并返回实现类的名称及类信息
     *
     * @param interfaceClass
     * @param <T>
     * @return
     */
    <T> Collection<ExtensionItem<T>> loadExtensionClasses(Class<T> interfaceClass);

    /**
     * 扩展点实现类加载器
     *
     * @author 悭梵
     * @date Created in 2018-09-12 15:06
     */
    interface ExtensionClassesLoader {

        /**
         * 加载扩展点实现类，并返回实现类的名称及类信息
         *
         * @param interfaceClass
         * @param <T>
         * @return
         */
        <T> Collection<ExtensionItem<T>> loadExtensionClasses(Class<T> interfaceClass);
    }
}
